from drf_haystack.viewsets import HaystackViewSet
from rest_framework.filters import OrderingFilter
from rest_framework.generics import ListAPIView

from MeiduoMall.utils.pagination import StandardResultsSetPagination
from goods.models import SKU
from goods.serializers import SKUSerializer, SKUIndexSerializer

"""
获取商品列表数据
当访问GET /list.html?cat=xxx时,会进入商品列表页,   这里cat用于过滤商品数据的第三级商品类别,即前端list.html中将cat传给下面路由中category_id
然后商品列表页中,在展示商品列表数据处需进行局部刷新,请求数据,此时会访问具体的第三级分类商品,同时需进行分页处理,此时这部分将访问具体的商品列表页面
GET /categories/(?P<category_id>\d+)/skus/?page=xxx&page_size=xxx&ordering=xxx --------SKUListView
注: 此二页面都在同一页面上,但具体是如何联系如何根据cat来判定对应的分类级别所对应的

请求方式: GET /categories/(?P<category_id>\d+)/skus/?page=xxx&page_size=xxx&ordering=xxx
请求参数: 路径参数+查询字符串参数   category_id(类别id/第三级类别)  page(页数)  page_size(每页数量)  ordering(排序关键字)
返回数据: count(数据总数int)  next(下一页的链接地址url)  previous(上一页的链接地址url)  results(商品SKU数据列表sku[])  id(商品SKU编号int)  name(商品名称str)  price(单价decimal)  default_image_url(默认图片str)  comments(评论量int)
"""


class SKUListView(ListAPIView):
    """SKU列表数据"""
    serializer_class = SKUSerializer

    filter_backends = (OrderingFilter,)  # 指定排序过滤器
    ordering_fields = ('create_time', 'price', 'sales')  # 排序字段

    pagination_class = StandardResultsSetPagination  # 分页,注: 这里采取的是当前视图才分页处理,若需全局分页处理则需在配置文件REST_FRAMEWORK中增加'DEFAULT_PAGINATION_CLASS': 'utils.pagination.StandardResultsSetPagination',那么这里就不用写了,或者写为None即不分页

    def get_queryset(self):
        # self.kwargs用于获取李静中的参数
        category_id = self.kwargs['category_id']
        return SKU.objects.filter(category_id=category_id, is_launched=True)


class SKUSearchViewSet(HaystackViewSet):
    """SKU搜索"""
    # 指定搜索模型,可以写入多个已经进行了索引的模型类
    index_models = [SKU]
    # 搜索序列化器
    serializer_class = SKUIndexSerializer
    # 分页,由于该视图会返回搜索结果的列表数据,所以可以为视图增加drf的分页功能
    pagination_class = StandardResultsSetPagination
